/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * PanelAtendimentoConsulta.java
 *
 * Created on 27/11/2011, 17:34:31
 */

package oogenda.view;

import java.awt.event.ItemEvent;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import oogenda.entidade.Agendamento;
import oogenda.entidade.Atendimento;
import oogenda.entidade.Data;
import oogenda.entidade.Dia;
import oogenda.entidade.Especialidade;
import oogenda.entidade.Medico;
import oogenda.entidade.Paciente;
import oogenda.util.DadosObjetos;

/**
 *
 * @author Pablo
 */
public class PanelAtendimentoConsulta extends javax.swing.JPanel {

    private static PanelAtendimentoConsulta panelAtendimentoConsulta;

    public static JPanel getPanel() {
        if(panelAtendimentoConsulta == null) {
            panelAtendimentoConsulta = new PanelAtendimentoConsulta();
        }
        panelAtendimentoConsulta.popularComboPaciente();
        panelAtendimentoConsulta.popularComboEspecialidade();
        panelAtendimentoConsulta.exibeCampoTextoOuCampo(0);
        
        return panelAtendimentoConsulta;
    }

    private PanelAtendimentoConsulta() {
        initComponents();
    }

     /**
     * Preenche combobox
     */
    public void popularComboPaciente() {
        List<Paciente> pacientes = DadosObjetos.pacientes;
        comboPaciente.removeAllItems();
        comboPaciente.addItem("");
        if(pacientes != null) {
            for (Paciente paciente : pacientes) {
                comboPaciente.addItem(paciente);
            }
        }
    }

    /**
     * 
     * @param num Recebe 0 ou 1.
     * Se for 0 exibe o campo texto, se for 1 exibe o combobox de médico.
     */
    public void exibeCampoTextoOuCampo(int num){
        if(num == 0) {
            comboMedico.setVisible(false);
            campoMedico.setVisible(true);
        } else if (num == 1) {
            comboMedico.setVisible(true);
            campoMedico.setVisible(false);
        }
    }
     /**
     * Preenche combobox Especialidades
     */
    public void popularComboEspecialidade() {
        List<Especialidade> especialidades = DadosObjetos.especialidades;
        comboEspecialidade.removeAllItems();
        comboEspecialidade.addItem("");
        for (Especialidade especialidade : especialidades) {
            comboEspecialidade.addItem(especialidade);
        }
    }

     /**
     * Preenche combobox Medico
     */
    public void popularComboMedico(String nomeEspecialidade) {
        List<Medico> medicos = DadosObjetos.medicos;
        comboMedico.removeAllItems();
        comboMedico.addItem("");
        for (Medico medicoItem : medicos) {
            if(medicoItem.getEspecialidade().getNome().equals(nomeEspecialidade))
                comboMedico.addItem(medicoItem);
        }
    }    

    /**
     * Se o nome do médico for digitado no campo texto, é preciso verificar se ele existe.
     * @param nomeMedico nome do médico digitado no campo texto
     */
    private boolean validaNomeMedico(String nomeMedico) {
        boolean retorno = true;
        if(nomeMedico != null && !nomeMedico.isEmpty()) {
            Medico medicoSelecionado = null;
                for(Medico medicoRow: DadosObjetos.medicos) {
                    if(medicoRow.getNome() != null) {
                        if(medicoRow.getNome().equals(nomeMedico)) {
                            medicoSelecionado = medicoRow;
                            break;
                        }
                    }
                }

                if(medicoSelecionado == null) {
                    retorno = false;
                    JOptionPane.showMessageDialog(null, "O médico informado não existe.", "Validação", JOptionPane.ERROR_MESSAGE, null);
                    
                }
        } else return false;
        return retorno;
    }
    
    private boolean validaData(String data) {
        boolean retorno = true;
        Data dataSelecionada = null;
        String []dataAux = data.split("/");
        String diaAux, mesAux, anoAux;
        Integer d, m, a;
        diaAux = dataAux[0];
        mesAux = dataAux[1];
        anoAux = dataAux[2];
        
        d = Integer.parseInt(diaAux);
        m = Integer.parseInt(mesAux);
        a = Integer.parseInt(anoAux);
                
        for(Data dataRow: DadosObjetos.datas) {
            if(dataRow != null) {
                if(dataRow.getDia() == d && 
                   dataRow.getMes() == m && 
                   dataRow.getAno() == a) {
                    dataSelecionada = dataRow;
                    break;
                }
            }
        }
        if(dataSelecionada == null) {
            retorno = false;
            if (d > 25) d = 5;
            else while (d%5 != 0) d++;
            a = 2012;
            
            for(Data dataRow: DadosObjetos.datas) {
            if(dataRow != null) {
                if(dataRow.getDia() == d && 
                   dataRow.getMes() == m && 
                   dataRow.getAno() == a) {
                    dataSelecionada = dataRow;
                    break;
                }
            }
        }
            int indice = DadosObjetos.datas.indexOf(dataSelecionada);
            List<Data> subListaData = DadosObjetos.datas.subList(indice, indice+3);
            String datasPossiveis = "";
            for (Iterator<Data> it = subListaData.iterator(); it.hasNext();) {
                Data dataIt = it.next();
                datasPossiveis += dataIt.getDia()+"/"+dataIt.getMes()+"/"+dataIt.getAno()+"\n";
            }
            
            JOptionPane.showMessageDialog(null, "A data informada não está disponível. "
                    + "As próximas datas possíveis são: \n" +datasPossiveis            
            ,"Validação", JOptionPane.ERROR_MESSAGE, null);
            
        }
        return retorno;
    }

     private boolean validaHorario(String horario) {
        boolean retorno = true;
        Dia diaSelecionado = null;      // na verdade é o horario selecionado
        String []diaAux = horario.split(":");
        String horaAux, minAux;
        Integer h, m;
        horaAux = diaAux[0];
        minAux = diaAux[1];

        
        h = Integer.parseInt(horaAux);
        m = Integer.parseInt(minAux);
                
        for(Dia diaRow: DadosObjetos.dias) {
            if(diaRow != null) {
                if(diaRow.getHora() == h && 
                   diaRow.getMinuto() == m)  {
                    diaSelecionado = diaRow;
                    break;
                }
            }
        }
        if(diaSelecionado == null) {
            retorno = false;
            if (m > 30) m = 0;
            else if (m > 0) m = 30;
            
            if (h > 17) h = 8;
            else if (h > 11 && h < 14) h = 14;
            else h++;
            
            
            
            for(Dia diaRow: DadosObjetos.dias) {
            if(diaRow != null) {
                if(diaRow.getHora() == h && 
                   diaRow.getMinuto() == m)  {
                    diaSelecionado = diaRow;
                    break;
                }
            }
        }
            int indice = DadosObjetos.dias.indexOf(diaSelecionado);
            List<Dia> subListaDia = DadosObjetos.dias.subList(indice, indice+3);
            String diasPossiveis = "";
            for (Iterator<Dia> it = subListaDia.iterator(); it.hasNext();) {
                Dia dataIt = it.next();
                diasPossiveis += dataIt.getHora()+":"+dataIt.getMinuto()+"\n";
            }
                        
            JOptionPane.showMessageDialog(null, "O horário informado não está disponível. "
                    + "Os próximos horários possíveis são: \n" +diasPossiveis            
            ,"Validação", JOptionPane.ERROR_MESSAGE, null);
            
        }
        return retorno;
    }
    
    public void salvar() {
        String nomeMedico = campoMedico.getText();
        String dia = campoDia.getText();
        String hora = campoHora.getText();
        Paciente paciente = (Paciente) comboPaciente.getSelectedItem();
        
        if(comboMedico.isVisible()) {
            
            
            if(comboMedico.getSelectedItem().equals("")) {
                JOptionPane.showMessageDialog(null, "O campo Médico deve ser preenchido.", "Validação", JOptionPane.ERROR_MESSAGE, null);
                return;
            } else nomeMedico = comboMedico.getSelectedItem().toString();
        } else {
            if(nomeMedico == null || nomeMedico.isEmpty()) {
               JOptionPane.showMessageDialog(null, "O campo Médico deve ser preenchido.", "Validação", JOptionPane.ERROR_MESSAGE, null);
               return;
            }
        }

        if(paciente == null) {
            JOptionPane.showMessageDialog(null, "O campo Paciente deve ser preenchido.", "Validação", JOptionPane.ERROR_MESSAGE, null);
            return;
        }

        if(dia == null || dia.isEmpty()) {
            JOptionPane.showMessageDialog(null, "O campo Dia deve ser preenchido.", "Validação", JOptionPane.ERROR_MESSAGE, null);
            return;
        }

        if(hora == null || hora.isEmpty()) {
            JOptionPane.showMessageDialog(null, "O campo Hora deve ser preenchido.", "Validação", JOptionPane.ERROR_MESSAGE, null);
            return;
        }

        if (!validaNomeMedico(nomeMedico) || !validaData(dia) || !validaHorario(hora)) return;
        

        DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm");
        Atendimento atendimento = new Atendimento();
        try {
            atendimento.setData(format.parse(dia + " " + hora));
            //verificar se existe horario na data.
        } catch (ParseException ex) {
            JOptionPane.showMessageDialog(null, "A data e hora informadas não sao validas", "Validação", JOptionPane.ERROR_MESSAGE, null);
        }
        atendimento.setCancelado(false);

        Agendamento agendamento = new Agendamento();
        agendamento.setDataHora(atendimento.getData());
        agendamento.setM_Agenda(null);
        agendamento.setPaciente(paciente);

        atendimento.setM_Agendamento(agendamento);

        if(paciente.getAtendimento() == null) {
            paciente.setAtendimento(new ArrayList<Atendimento>());
        }

        paciente.getAtendimento().add(atendimento);

        JOptionPane.showMessageDialog(null, "Dados Salvos", "Sucesso", JOptionPane.INFORMATION_MESSAGE, null);

        //limpar campos
        campoMedico.setText(null);
        campoDia.setText(null);
        campoHora.setText(null);
        comboPaciente.setSelectedItem(null);
        comboMedico.setSelectedItem(null);
        comboEspecialidade.setSelectedItem(null);
    }


    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        titulo = new javax.swing.JLabel();
        medico = new javax.swing.JLabel();
        campoMedico = new javax.swing.JTextField();
        labelDia = new javax.swing.JLabel();
        campoDia = new javax.swing.JFormattedTextField();
        labelHora = new javax.swing.JLabel();
        campoHora = new javax.swing.JFormattedTextField();
        jButton1 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        comboPaciente = new javax.swing.JComboBox();
        jLabel2 = new javax.swing.JLabel();
        comboEspecialidade = new javax.swing.JComboBox();
        comboMedico = new javax.swing.JComboBox();

        titulo.setFont(new java.awt.Font("Verdana", 1, 14));
        titulo.setText("Agendamento de Consultas");

        medico.setText("Medico:");

        labelDia.setText("Dia:");

        campoDia.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.DateFormatter()));
        campoDia.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                campoDiaActionPerformed(evt);
            }
        });

        labelHora.setText("Hora:");

        campoHora.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.DateFormatter(java.text.DateFormat.getTimeInstance(java.text.DateFormat.SHORT))));

        jButton1.setText("Salvar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jLabel1.setText("Paciente:");

        comboPaciente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                comboPacienteActionPerformed(evt);
            }
        });

        jLabel2.setText("Especialidade:");

        comboEspecialidade.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                comboEspecialidadeItemStateChanged(evt);
            }
        });
        comboEspecialidade.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                comboEspecialidadeActionPerformed(evt);
            }
        });

        comboMedico.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                comboMedicoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(titulo, javax.swing.GroupLayout.DEFAULT_SIZE, 403, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(medico)
                    .addComponent(labelDia)
                    .addComponent(labelHora)
                    .addComponent(jLabel2)
                    .addComponent(jLabel1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                .addComponent(campoHora, javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(campoDia, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(jButton1, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                .addComponent(comboMedico, 0, 19, Short.MAX_VALUE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(campoMedico, javax.swing.GroupLayout.PREFERRED_SIZE, 276, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addContainerGap(20, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(comboEspecialidade, javax.swing.GroupLayout.Alignment.LEADING, 0, 168, Short.MAX_VALUE)
                            .addComponent(comboPaciente, 0, 168, Short.MAX_VALUE))
                        .addGap(153, 153, 153))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(titulo)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(comboPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 18, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(comboEspecialidade, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(medico)
                    .addComponent(campoMedico, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(comboMedico, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelDia)
                    .addComponent(campoDia, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(labelHora)
                    .addComponent(campoHora, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(30, 30, 30)
                .addComponent(jButton1)
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void campoDiaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_campoDiaActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_campoDiaActionPerformed

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        salvar();
    }//GEN-LAST:event_jButton1ActionPerformed

private void comboPacienteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboPacienteActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_comboPacienteActionPerformed

private void comboEspecialidadeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboEspecialidadeActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_comboEspecialidadeActionPerformed

private void comboMedicoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboMedicoActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_comboMedicoActionPerformed

private void comboEspecialidadeItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_comboEspecialidadeItemStateChanged
    if(evt.getStateChange() == ItemEvent.SELECTED) {
        comboMedico.removeAllItems();
        if(comboEspecialidade.getSelectedItem().equals("") || comboEspecialidade.getSelectedItem() == null) {
            panelAtendimentoConsulta.exibeCampoTextoOuCampo(0);
        }
        else {
            panelAtendimentoConsulta.popularComboMedico(comboEspecialidade.getSelectedItem().toString());
            panelAtendimentoConsulta.exibeCampoTextoOuCampo(1);
        }   
    }
}//GEN-LAST:event_comboEspecialidadeItemStateChanged


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JFormattedTextField campoDia;
    private javax.swing.JFormattedTextField campoHora;
    private javax.swing.JTextField campoMedico;
    private javax.swing.JComboBox comboEspecialidade;
    private javax.swing.JComboBox comboMedico;
    private javax.swing.JComboBox comboPaciente;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel labelDia;
    private javax.swing.JLabel labelHora;
    private javax.swing.JLabel medico;
    private javax.swing.JLabel titulo;
    // End of variables declaration//GEN-END:variables

}
